package com.xiaotao.learn.loader;

import com.xiaotao.learn.loader.testclass.HasInnerClass;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

public class LoadByForName {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // 单纯定义该类型变量，无事发生
        System.out.println("-- 单纯定义该类型变量，无事发生");
        HasInnerClass a = null;

        // 利用Class.forName手动通过类名称触发类加载，静态代码块执行，但内部静态类未被加载
        System.out.println("-- 手动通过类名称触发类加载，静态代码块执行，但内部静态类未被加载");
        Class.forName("com.xiaotao.learn.loader.testclass.HasInnerClass");

        // 尝试加载内部私有静态类
        // 利用Class.forName加载内部类
        System.out.println("-- 利用Class.forName加载内部类");
        Class.forName("com.xiaotao.learn.loader.testclass.HasInnerClass$PrivateInnerClass");


        // 尝试加载内部公有静态类
        System.out.println("-- 通过反射获取内部公有静态类Class");
        Class<?> aClass = LoadByForName.class.getClassLoader().loadClass("com.xiaotao.learn.loader.testclass.HasInnerClass$PublicInnerClass");
        System.out.println("-- 获取内部公有静态类的构造方法");
        Constructor<?> constructor = aClass.getConstructor();
        System.out.println("-- 实例内部公有静态内部类");
        constructor.newInstance();

        // 调用所有内部类，触发类加载
        System.out.println("-- 调用所有内部类，触发类加载，只有私有默认内部类未被加载，此时会被加载，已加载的不会重复执行静态代码块");
        HasInnerClass.active();

    }
}
